package com.demo.user.repository;

import com.demo.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author 1
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User>,PagingAndSortingRepository<User, Long>
{
    /**
     * 获取用户信息
     * @param name
     * @return
     */
    @Query(value = "select t from User t where t.name like %?1%")
    List<User> findByNameLike(String name);

  /**
   * nativeQuery = true 的含义是使用原生SQL，即注解中的SQL语句会生效，false的话就不会生效。 SQL语句中 ?1、?2、?3、?4 的意思是代表方法中的第几个参数。
   * SQL中模糊查询的写法为 like concat('%', ?1, '%') if(?1 !='',name like concat('%',?1,'%'),1=1)
   * 代表传入的参数name如果不为""（Spring类型空是""而不是null）将参数传入name，如果为空时显示1=1 代表参数为真，对查询结果不产生作用。IF
   * 的语法满足mysql的基本语法，IF(expr1,expr2,expr3)， 如果 expr1 为真(expr1 <> 0 以及 expr1 <> NULL)，那么 IF() 返回
   * expr2，否则返回expr3 if(IFNULL(?3,'') !='',age=?3,1=1)
   * 表示如果传入的年龄是null，则替换成空字符串，然后判断是否为空，不为空则将参数传入age，否则忽略不对查询结果产生影响。IFNULL 是mysql中的一个函数，这个函数一般用来替换
   * NULL 值的。IFNULL(value1,value2)，判断value1是否为null，如果为null则用value2替换。
   * 参数定义时，定义数值，应使用Integer，如果用int定义，当入参为NULL时，程序会报空指针错误。原因是JAVA 中 int 是值类型，非对象，不可以设置为 NULL，integer
   * 是对象类型，可以设置为NULL
   * 原文链接：https://blog.csdn.net/lc_2014c/article/details/122706211
   *
   * @param name
   * @param mobile
   * @param status
   * @param type
   * @return
   */
  @Query(
      value =
          "select * from bl_user where " +
                  "if(?1 !='',name like concat('%',?1,'%'),1=1) and " +
                  "if(?2 !='',mobile=?2,1=1) and " +
                  "if(IFNULL(?3,'') !='',status=?3,1=1) and " +
                  "if(IFNULL(?4,'') !='',type=?4,1=1) ",
      nativeQuery = true
  )
  List<User> find(String name, String mobile, Integer status, Integer type);

}
